package com.synjones.zeuscloudweb.service.impl;

import com.synjones.zeus.model.web.AdminRoleBean;
import com.synjones.zeus.model.web.MenuBean;
import com.synjones.zeus.model.web.RoleBean;
import com.synjones.zeus.model.web.RoleMenuBean;
import com.synjones.zeuscloudweb.dao.RoleDaoMapper;
import com.synjones.zeuscloudweb.service.RoleService;
import com.synjones.zeuscloudweb.util.ccl.datastructure.impl.BaseDto;
import com.synjones.zeuscloudweb.util.ccl.util.G4Utils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.List;

/**
 * @author yys
 * Description:
 * @date created in 10:40 2018-01-15
 * Modified by:
 */
@Service
public class RoleServiceImpl implements RoleService {
    @Resource
    private RoleDaoMapper roleDaoMapper;

    /**
     * 获取菜单树
     *
     * @param
     * @return throws
     * @author yys
     * Description:  获取菜单树
     * @date 10:45 2018-01-15
     */
    @Override
    public BaseDto selectTreeMenu() {
        BaseDto jsonDto = new BaseDto();
        try {
            List<MenuBean> result = roleDaoMapper.selectTreeMenu();
            MenuBean root = new MenuBean();
            root.setName("系统菜单");
            root.setId("000");
            root.setOpen(true);
            root.setChecked(true);
            jsonDto.put("success", new Boolean(true));
            jsonDto.put("msg", "操作成功!");
            jsonDto.put("data", result);
        } catch (Exception e) {
            jsonDto.put("success", new Boolean(false));
            jsonDto.put("msg", "操作失败!");
            jsonDto.put("data", null);
        }
        return jsonDto;
    }

    /**
     * 添加角色以及角色拥有菜单
     *
     * @param roleName 角色名
     * @param menuId   权限菜单ID
     * @param remarks  备注
     * @return BaseDto
     * throws
     * @author yys
     * Description:  添加角色以及角色拥有菜单
     * @date 12:08 2018-01-15
     */
    @Override
    @Transactional
    public BaseDto insertRoleMenu(String roleName, String menuId, String remarks) {
        BaseDto jsonDto = new BaseDto();
        try {
            roleDaoMapper.insertRole(roleName, remarks);
            RoleBean roleBean = roleDaoMapper.selectRoleByRoleName(roleName);
            if (G4Utils.isNotEmpty(roleBean) && G4Utils.isNotEmpty(roleBean.getRoleId()) && G4Utils.isNotEmpty(menuId)) {
                String[] menuIdArray = menuId.split(",");
                for (String muId : menuIdArray) {
                    roleDaoMapper.insertRoleMenu(roleBean.getRoleId(), muId);
                }
            }
            jsonDto.put("success", new Boolean(true));
            jsonDto.put("msg", "操作成功!");
            jsonDto.put("data", null);
        } catch (Exception e) {
            jsonDto.put("success", new Boolean(false));
            jsonDto.put("msg", "操作失败!");
            jsonDto.put("data", null);
        }
        return jsonDto;
    }

    /**
     * 根据角色名查询角色是否已经存在
     *
     * @param roleName 角色名
     * @return throws
     * @author yys
     * Description:  根据角色名查询角色是否已经存在
     * @date 12:18 2018-01-15
     */
    @Override
    public int selectCountRoleByRoleName(String roleName) {
        int count;
        try {
            count = roleDaoMapper.selectCountRoleByRoleName(roleName);
        } catch (Exception e) {
            count = 1;
        }
        return count;
    }

    /**
     * 分页获取角色列表
     *
     * @param orderColumn 排序字段
     * @param orderDir    排序方式
     * @param roleBean    条件查询
     * @return throws
     * @author yys
     * Description:  分页获取角色列表
     * @date 10:19 2018-01-16
     */
    @Override
    public List<RoleBean> selectRoleByPage(String orderColumn, String orderDir, RoleBean roleBean) {
        return roleDaoMapper.selectRoleByPage(orderColumn, orderDir, roleBean);
    }

    @Override
    @Transactional
    public BaseDto deleteRoleByRoleId(String roleId) {
        BaseDto jsonDto = new BaseDto();
        try {
            String[] roleIdArray = roleId.split(",");
            for (String id : roleIdArray) {
                //先删除管理员角色关联表
                roleDaoMapper.deleteAdminRoleByRoleId(id);
                //再删除角色表
                roleDaoMapper.deleteRoleByRoleId(id);
                //最后删除角色菜单关联表
                roleDaoMapper.deleteRoleMenuByRoleId(id);
            }
            jsonDto.put("success", new Boolean(true));
            jsonDto.put("msg", "操作成功!");
            jsonDto.put("data", null);
        } catch (Exception e) {
            jsonDto.put("success", new Boolean(false));
            jsonDto.put("msg", "操作失败!");
            jsonDto.put("data", null);
        }
        return jsonDto;
    }

    /**
     * 获取全部角色信息
     *
     * @param
     * @return List<RoleVO>
     * throws
     * @author yys
     * Description:  获取全部角色信息
     * @date 15:16 2018-01-16
     */
    @Override
    public List<RoleBean> selectRole() {
        return roleDaoMapper.selectRole();
    }

    /**
     * 根据管理员userId获取管理员角色关联信息
     *
     * @param userId 管理员ID
     * @return AdminRoleBean
     * throws
     * @author yys
     * Description:  根据管理员userId获取管理员角色关联信息
     * @date 16:59 2018-01-16
     */
    @Override
    public AdminRoleBean selectAdminRoleByUserId(String userId) {
        return roleDaoMapper.selectAdminRoleByUserId(userId);
    }

    /**
     * 根据角色ID获取角色详情
     *
     * @param roleId 角色Id
     * @return throws
     * @author yys
     * Description:  根据角色ID获取角色详情
     * @date 11:06 2018-01-17
     */
    @Override
    public RoleBean selectRoleByRoleId(String roleId) {
        return roleDaoMapper.selectRoleByRoleId(roleId);
    }

    /**
     * 根据角色Id查询角色菜单关联表 此角色以拥有的菜单集合
     *
     * @param roleId 角色Id
     * @return throws
     * @author yys
     * Description:  根据角色Id查询角色菜单关联表 此角色以拥有的菜单集合
     * @date 12:06 2018-01-17
     */
    @Override
    public BaseDto selectTreeMenuForUpdate(String roleId) {
        BaseDto jsonDto = new BaseDto();
        try {
            //所有菜单信息
            List<MenuBean> menuVOList = roleDaoMapper.selectTreeMenu();
            //角色已选择菜单信息
            List<RoleMenuBean> roleMenuVOList = roleDaoMapper.selectRoleMenuByRoleId(roleId);
            for (RoleMenuBean roleMenuBean : roleMenuVOList) {
                for (MenuBean menuBean : menuVOList) {
                    if (roleMenuBean.getMenuId().equals(menuBean.getId())) {
                        menuBean.setChecked(true);
                    }
                }
            }
            jsonDto.put("success", new Boolean(true));
            jsonDto.put("msg", "操作成功!");
            jsonDto.put("data", menuVOList);
        } catch (Exception e) {
            jsonDto.put("success", new Boolean(false));
            jsonDto.put("msg", "操作失败!");
            jsonDto.put("data", null);
        }
        return jsonDto;
    }

    /**
     * 修改角色和角色拥有的权限菜单
     *
     * @param roleBean 角色实体
     * @param menuId   菜单Id集合
     * @return throws
     * @author yys
     * Description:  修改角色和角色拥有的权限菜单
     * @date 14:11 2018-01-17
     */
    @Override
    @Transactional
    public BaseDto updateRoleAndRoleMenu(RoleBean roleBean, String menuId) {
        BaseDto jsonDto = new BaseDto();
        try {
            roleDaoMapper.updateRole(roleBean);
            //修改角色菜单关联表 1.删除已有数据 2.添加新数据  实现修改
            roleDaoMapper.deleteRoleMenuByRoleId(roleBean.getRoleId());
            if (G4Utils.isNotEmpty(menuId)) {
                String[] menuIdArray = menuId.split(",");
                for (String muId : menuIdArray) {
                    roleDaoMapper.insertRoleMenu(roleBean.getRoleId(), muId);
                }
            }
            jsonDto.put("success", new Boolean(true));
            jsonDto.put("msg", "操作成功!");
            jsonDto.put("data", null);
        } catch (Exception e) {
            jsonDto.put("success", new Boolean(false));
            jsonDto.put("msg", "操作失败!");
            jsonDto.put("data", null);
        }
        return jsonDto;
    }

    @Override
    public int updateRoleAvailable(RoleBean roleBean) {
        return roleDaoMapper.updateRoleAvailable(roleBean);
    }

    /**
     * 根据角色Id查询角色菜单关联表 此角色以拥有的菜单集合
     *
     * @param roleId 角色Id
     * @return List<RoleMenuBean>
     * throws
     * @author yys
     * Description:  根据角色Id查询角色菜单关联表 此角色以拥有的菜单集合
     * @date 11:32 2018-01-17
     */
    @Override
    public List<RoleMenuBean> selectRoleMenuByRoleId(String roleId) {
        return roleDaoMapper.selectRoleMenuByRoleId(roleId);
    }
}
